package net.jgrm.product.service;

/**
 * 商品库存服务接口
 * 专门处理库存相关的高频操作，与商品基本信息分离
 *
 * @author jgrm
 */
public interface IProductStockService {

    /**
     * 获取商品库存
     *
     * @param productId 商品ID
     * @return 库存数量，如果商品不存在返回null
     */
    Integer getStock(Long productId);

    /**
     * 减库存（用于下单）
     *
     * @param productId 商品ID
     * @param quantity  减少的数量
     * @return 是否成功
     */
    boolean decreaseStock(Long productId, Integer quantity);

    /**
     * 增加库存（用于退款）
     *
     * @param productId 商品ID
     * @param quantity  增加的数量
     * @return 是否成功
     */
    boolean increaseStock(Long productId, Integer quantity);

    /**
     * 设置库存
     *
     * @param productId 商品ID
     * @param stock     库存数量
     * @return 是否成功
     */
    boolean setStock(Long productId, Integer stock);

    /**
     * 预减库存（秒杀场景）
     *
     * @param productId 商品ID
     * @param quantity  预减数量
     * @return 预减后的库存，如果库存不足返回-1
     */
    Integer preDecrease(Long productId, Integer quantity);

    /**
     * 恢复预减库存（订单取消）
     *
     * @param productId 商品ID
     * @param quantity  恢复数量
     */
    void restorePreDecrease(Long productId, Integer quantity);

    /**
     * 确认预减库存（订单支付成功）
     *
     * @param productId 商品ID
     * @param quantity  确认数量
     */
    void confirmPreDecrease(Long productId, Integer quantity);

    /**
     * 刷新库存缓存（从数据库重新加载）
     *
     * @param productId 商品ID
     */
    void refreshStockCache(Long productId);

    /**
     * 预热库存缓存（秒杀开始前）
     *
     * @param productIds 商品ID列表
     */
    void warmupStockCache(Long... productIds);
}